﻿#region << 版 本 注 释 >>
/*----------------------------------------------------------------
// Copyright (C) 2021 kingerrobot
// 版权所有。 
//
// 文件名：BEquip
// 文件功能描述：
//
// 创建者：名字 (zzl)
// 时间：2021/12/6 15:09:58
//
// 修改人：
// 时间：
// 修改说明：
// 版本：V1.0.0
//----------------------------------------------------------------*/
#endregion
namespace KingerRobot.MexicoSailunWMS.SpiService;
internal class BRcsEquip : IRcsEquip
{
    private readonly static ITask _Task = new BTask();
    private readonly static ITaskCmd _TaskCmd = new BTaskCmd();

    public List<POWcsEquipStatus> GetAllEquipStatues()
    {
        var db = Db.Default;
        var result = db.WcsEquipStatuss.ToList();
        return result;
    }
    public List<PORcsEquip> GetEquips()
    {
        var db = Db.Default;
        var result = db.RcsEquips.Where(t => t.UseFlag == 1).ToList();
        return result;
    }

    public List<PORcsEquip> GetAllEquips()
    {
        var db = Db.Default;
        var result = db.RcsEquips.ToList();
        return result;
    }
    public PORcsEquip GetRcsEquipByName(string name)
    {
        var db = Db.Default;
        var result = db.RcsEquips
            .Where(t => t.EquipName.Contains(name) && t.EquipType == 1)
            .FirstOrDefault();
        return result;
    }
    public PORcsEquip GetRcsEquipById(long? id)
    {
        var db = Db.Default;
        var result = db.RcsEquips
            .Where(t => t.Id == id)
            .FirstOrDefault();
        return result;
    }
    public List<PORcsEquip> GetRcsEquipByIds(List<long?> ids)
    {
        var db = Db.Default;
        var result = db.RcsEquips
            .Where(t => ids.Contains(t.Id))
            .ToList();
        return result;
    }

    public List<PORcsEquip> GetAbnormalEquipAll()
    {
        var db = Db.Default;
        var result = db.RcsEquips
            .Where(t => t.EquipEnable == 0 || t.ErrCode > 0)
            .ToList();
        return result;
    }

    public PORcsEquip GetWorkEquipById(long? id)
    {
        var db = Db.Default;
        var result = db.RcsEquips
            .Where(t => t.EquipEnable == 1 && t.ErrCode == 0 && t.Id == id)
            .FirstOrDefault();
        return result;
    }

    public bool IsEnableEquipById(long? id) => GetWorkEquipById(id) is not null;

    public PORcsEquip GetRcsEquipByCode(string equipCode)
    {
        var db = Db.Default;
        var result = db.RcsEquips
            .Where(t => t.EquipEnable == 1 && t.ErrCode == 0 && t.EquipCode == equipCode)
            .FirstOrDefault();
        return result;
    }

    public List<PORcsEquip> GetRcsEquipByType(List<long?> types)
    {
        var db = Db.Default;
        var result = db.RcsEquips
            .Where(t => types.Contains(t.EquipType))
            .ToList();
        return result;
    }

    public int UpdateEquipEnable(long id)
    {
        var db = Db.Default;
        var result = 0;
        var equip = db.RcsEquips
            .Where(t => t.Id == id).FirstOrDefault();
        var equipEnable = equip.EquipEnable;
        if (equip is not null)
        {
            equip.EquipEnable = equip.EquipEnable == 1 ? 0 : 1;
            equip.UpdateTime = DateTime.Now;
            result = db.SaveChanges();
        }
        if (equipEnable == 1)
        {
            if (equip is not null && equip.EquipType == 10 && equip.GroupIndex == 2)
            {
                var change = UpdateEmsWhenTrouble(equip);
            }
        }
        return result;
    }
    public int UpdateEquipEnableByIds(List<long?> ids, int enable)
    {
        var db = Db.Default;
        var result = db.RcsEquips
            .Where(t => ids.Contains(t.Id)).Update(new PORcsEquip
            {
                EquipEnable = enable,
                UpdateTime = DateTime.Now,
            });
        return db.SaveChanges();
    }

    public bool UpdateEmsWhenTrouble(PORcsEquip pORcsEquip)
    {
        var db = Db.Default;
        long emsloc = (long)pORcsEquip.EmsDefaultLoc;
        var abnormalloc = db.WcsEmsAbnormalLocs.Where(t => t.OutputLoc == emsloc).FirstOrDefault();
     
        var beforecmds = _TaskCmd.GetTaskCmdByTargetLocId(emsloc);
        foreach (var cmd in beforecmds)
        {
            var beforetask = _Task.GetTaskByTaskId((long)cmd.TaskId);
            if (beforetask.TaskType > 0 && beforetask.SpinScanId is not null && beforetask.SpinScanId > 0) {
                _Task.EditTaskType((long)beforetask.Id, 9);
                _Task.UpdateTaskTargetLoc((long)beforetask.Id, (long)abnormalloc.AbnormalLoc);
                _TaskCmd.BakAndDeleteCmd((long)beforetask.Id);
            }
        }
        return true;
    }
}
